import os
import shutil
from setuptools import setup
from Cython.Build import cythonize


def delete_so_files(directory, exclude_dir='build'):
    """
    递归删除指定目录下的所有 .so 文件，但忽略指定的目录及其子目录。
    :param directory: 要搜索的目录。
    :param exclude_dir: 要排除的目录名称。
    """
    for root, dirs, files in os.walk(directory):
        # 检查当前目录路径中是否包含排除的目录名
        if exclude_dir in root.split(os.sep):
            continue  # 跳过此目录及其所有文件

        for file in files:
            if file.endswith('.so'):
                full_path = os.path.join(root, file)
                os.remove(full_path)
                print(f"Deleted .so file: {full_path}")


def copy_and_compile(src_dir, dist_dir, build_dir):
    # 创建目标和构建目录（如果不存在）
    os.makedirs(dist_dir, exist_ok=True)
    os.makedirs(build_dir, exist_ok=True)

    # 遍历源目录中的文件和子目录
    for root, dirs, files in os.walk(src_dir):
        for file in files:
            if file.endswith('.py'):
                # 计算目标文件路径
                rel_path = os.path.relpath(root, src_dir)
                dist_path = os.path.join(dist_dir, rel_path)
                os.makedirs(dist_path, exist_ok=True)

                # 复制文件到目标目录
                src_file = os.path.join(root, file)
                dist_file = os.path.join(dist_path, file)
                shutil.copy(src_file, dist_file)

    # 使用 Cython 编译所有 Python 文件到 .so 文件
    setup(
        ext_modules=cythonize(f"{dist_dir}/**/*.py", build_dir=build_dir
                              ,compiler_directives={'language_level': "3"}
                              ),
        script_args=['build_ext', '--inplace']
    )

    # 删除目标目录中的 .py 文件，只保留 .so 文件
    for root, dirs, files in os.walk(dist_dir):
        for file in files:
            if file.endswith('.py'):
                os.remove(os.path.join(root, file))


# 定义源代码目录和目标编译目录
src_dir = '.'  # 调整为你的 Django 项目目录
build_dir = 'build'
dist_dir = 'dist'

# 执行复制和编译流程


if __name__ == '__main__':
    copy_and_compile(src_dir, dist_dir, build_dir)

    delete_so_files(src_dir)
